//============================================================================
// Name        : generar_datos.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include "..\\..\\menu\\src\\libreria.h"

using namespace std;


FILE *pacientes;
FILE *citas;
FILE *punteros;
FILE *indice;
FILE *codigos;

typedef struct {
	long int cod_paciente;
	char nombre[15];
	char fecha_nac[11];
	char sexo;
	char marca;
}tipo_paciente;

typedef map<long int, bool, less<long int> > tipo_mapa_pacientes;
typedef map<string, int, less<string> > tipo_mapa_citas;
char nombres[10][15]={"Pablo","Pedro","Paco","Maria","Lola","Juan","Pepe","Hector","Adrian","Laura"};
char sexo[2]={'M','H'};
bool abrir_ficheros();
void cerrar_ficheros();
void generar_en_memoria();
string generar_fecha(bool es_cita);
void escribir();
string pasa_a_string(int number);
//variables globales:
tipo_mapa_pacientes mapa_pacientes;
tipo_mapa_citas mapa_citas;
tipo_paciente cliente;
tipo_cita revision;

int main() {
	bool seguir;
	seguir=abrir_ficheros();
	if (seguir==true)
	{
		generar_en_memoria();
		escribir();

	}
	cerrar_ficheros();
	//sino, termina el programa
	system("pause");
	return 0;
}

bool abrir_ficheros()
{	//abre todos los ficheros para lectura y carga los datos en memoria
	bool abierto=false;


	if ((pacientes=fopen("..\\..\\datos\\pacientes.dat","r+b"))==NULL) //si el fichero no existe
	{
		if ((pacientes=fopen("..\\..\\datos\\pacientes.dat","w+b"))==NULL)
			printf("El fichero pacientes no se puede abrir\n");
		if ((citas=fopen("..\\..\\datos\\citas.dat","w+b"))==NULL)
			printf("El fichero citas no se puede abrir\n");
		if ((punteros=fopen("..\\..\\datos\\punteros.dat","w"))==NULL)
			printf("El fichero punteros no se puede abrir\n");
		if ((indice=fopen("..\\..\\datos\\indice.dat","w"))==NULL)
			printf("El fichero indice no se puede abrir\n");
		if ((codigos=fopen("..\\..\\datos\\codigos.dat","w"))==NULL)
			printf("El fichero codigos no se puede abrir\n");
		abierto=true;
	}
	else
	{
		char respuesta;
		printf("Los ficheros ya existen. Quiere volver a generar pacientes?(s/n)");
		cin>>respuesta;
		if(respuesta=='s')
		{//los ficheros se van a abrir en modo escritura
			system("del ..\\..\\datos\\pila.dat");
			system("del ..\\..\\datos\\indice_historial.dat");
			system("del ..\\..\\datos\\historial.dat");
			system("cls");
			if ((pacientes=fopen("..\\..\\datos\\pacientes.dat","w+b"))==NULL)
				printf("El fichero pacientes no se puede abrir\n");
			if ((citas=fopen("..\\..\\datos\\citas.dat","w+b"))==NULL)
				printf("El fichero citas no se puede abrir\n");
			if ((punteros=fopen("..\\..\\datos\\punteros.dat","w"))==NULL)
				printf("El fichero punteros no se puede abrir\n");
			if ((indice=fopen("..\\..\\datos\\indice.dat","w"))==NULL)
				printf("El fichero indice no se puede abrir\n");
			if ((codigos=fopen("..\\..\\datos\\codigos.dat","w"))==NULL)
				printf("El fichero codigos no se puede abrir\n");
			abierto=true;
		}
	}
	return abierto;
}//final

string generar_fecha(bool es_cita)
{

	string fecha;
	int dia,mes,ano;

	if (es_cita==true) //genera fecha del formato YYYY-MM-DD-HH
	{
		ano=rand()%11 + 2013; //va de 2013 a 2023
		mes=rand()%12 + 1; //meses
		dia=rand()%31 + 1; //dias en un mes
		int tabla_hora[8]={11,12,13,14,16,17,18,19};

		fecha=fecha+pasa_a_string(ano);
		fecha.push_back('-');

		if(mes>=10)
			fecha=fecha+pasa_a_string(mes);
		else
			fecha=fecha+"0"+pasa_a_string(mes);
		fecha.push_back('-');
		if(dia>=10)
			fecha=fecha+pasa_a_string(dia);
		else
			fecha=fecha+"0"+pasa_a_string(dia);
		fecha.push_back('-');
		fecha=fecha+pasa_a_string(tabla_hora[rand()%8]);




	}
	else //genera fecha del formato YYYY-MM-DD para nacimiento del cliente
	{
		ano=rand()%111 + 1900; //va de 1900 a 2010
		mes=rand()%12 + 1; //meses
		dia=rand()%31 + 1; //dias en un mes
		fecha=fecha+pasa_a_string(ano);
		fecha.push_back('-');
		fecha=fecha+pasa_a_string(mes);
		fecha.push_back('-');
		fecha=fecha+pasa_a_string(dia);


	}
	return fecha;
}

void generar_en_memoria()
{
	long int codigo_paciente;
	while (mapa_pacientes.size()<1000)
	{
		codigo_paciente=rand()*rand()%900000+100000; //genera numeros entre 100 000 - 999 999 (6 digitos)
		mapa_pacientes.insert(pair<long int,bool> (codigo_paciente,false));
	}

	int posicion=1;

	while (mapa_citas.size()<5000)
	{
		string fecha_hora;
		fecha_hora=generar_fecha(true);
		if(mapa_citas.find(fecha_hora)==mapa_citas.end())
		{
			mapa_citas.insert(pair<string,int> (fecha_hora,posicion));
			posicion++;
		}
	}
}
void escribir()
{   //para punteros
	fprintf(punteros,"5000 0\n");
	fprintf(punteros,"0"); //el numero de registros en el fichero historial.dat
	//para indice_citas
	tipo_mapa_citas::iterator itr;
	for(itr=mapa_citas.begin();itr!=mapa_citas.end();itr++)
	{
		fprintf(indice,"%s >>> %d\n",(*itr).first.c_str(),(*itr).second); //con el metodo .c_str() pasamos a cadena de tipo char
	}
	//para pacientes
	tipo_paciente temp;
	tipo_mapa_pacientes::iterator itr2;
	int b=0;
	for(itr2=mapa_pacientes.begin();itr2!=mapa_pacientes.end();itr2++)
	{   b++;
	temp.cod_paciente=(*itr2).first;
	strcpy(temp.fecha_nac,generar_fecha(false).c_str());
	strcpy(temp.nombre,nombres[rand()%10]);
	temp.sexo=sexo[rand()%2];
	temp.marca='A';
	/*------------*/
	fwrite(&temp,sizeof(tipo_paciente),1,pacientes);
	//para el fichero que contiene todos los codigos de los pacientes
	fprintf(codigos,"%ld\n",(*itr2).first);

	}
	//para citas
	tipo_cita cita;
	int f=0;
	for(int i=0;i<5;i++)
	{
		for(itr2=mapa_pacientes.begin();itr2!=mapa_pacientes.end();itr2++)
		{
			f++;
			cita.cod_paciente=(*itr2).first;
			strcpy(cita.tratamiento,"El paciente presenta sintomas de envenamiento por radiacion.Se le va a ingresar.");
			cita.marca='A';
			fwrite(&cita,sizeof(tipo_cita),1,citas);
		}
	}
	cout<<"Se han generado: "<<b<<" pacientes."<<endl;
	cout<<"Se han generado: "<<f<<" citas."<<endl;

}

string pasa_a_string(int number)
{
	stringstream ss;//create a stringstream
	ss << number;//add number to the stream
	return ss.str();//return a string with the contents of the stream
}

void cerrar_ficheros()
{
	fclose(pacientes);
	fclose(citas);
	fclose(punteros);
	fclose(indice);
	fclose(codigos);
}
